/**
 * ControladoraUsuario.java
 */

 /**
 *  AdSec: Administrador de Secundarias
 *  Copyright (C) 2009 Daniela Ramírez Chaves (dannyrch@gmail.com)
 *  Copyright (C) 2009 Leonel Salazar Valverde (leo87sv@gmail.com)
 *
 *  This file is part of AdSec.
 *  AdSec is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  AdSec is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with AdSec.  If not, see <http://www.gnu.org/licenses/>.
 */

package adsec.negocios;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import adsec.entidades.Usuario;
import adsec.entidades.UsuarioGrid;
import adsec.datos.ControladoraBDUsuario;
import java.util.LinkedList;
import adsec.entidades.PerfilYUsuarioBD;

public class ControladoraUsuario {

    private ControladoraBDUsuario controladoraBD;
    private LinkedList<UsuarioGrid> listaUsuariosGrid;
    public final static int PASSWORD_MAL = 0;
    public final static int PASSWORD_OK_LOGIN_ERROR = 1;
    public final static int PASSWORD_OK_LOGIN_OK = 2;
    public final static int NO_EXISTE_USUARIO = 3;

    public ControladoraUsuario(){
        this.controladoraBD = new ControladoraBDUsuario();
        this.listaUsuariosGrid = new LinkedList<UsuarioGrid>();
    }//fin de constructor

    public Usuario consultarUsuarioGrid(int filaUsuarioGrid){
        Usuario usuario = new Usuario();
        if(filaUsuarioGrid >= 0 && filaUsuarioGrid < this.listaUsuariosGrid.size()){
            usuario = this.controladoraBD.consultarUsuario(this.listaUsuariosGrid.get(filaUsuarioGrid).getIdUsuario());
        }
        return usuario;
    }

    public Usuario consultarUsuario(String nombre){
        return this.controladoraBD.consultarUsuario(nombre);
    }

    public LinkedList<UsuarioGrid> consultarUsuarios(){
        this.listaUsuariosGrid = this.controladoraBD.consultarUsuarios();
        return this.listaUsuariosGrid;
    }

    public int insertarUsuario(Usuario usuario){
        usuario.setPassword(this.encriptarPassword(usuario.getPassword()));
        return this.controladoraBD.insertarUsuario(usuario);
    }

    public int modificarUsuario(Usuario usuario){
        usuario.setPassword(this.encriptarPassword(usuario.getPassword()));
        return this.controladoraBD.modificarUsuario(usuario);
    }

    public int eliminarUsuario(int idUsuario){
        return this.controladoraBD.eliminarUsuario(idUsuario);
    }

    public int loguearUsuario(String nombre, String password){
        int resultado = PASSWORD_MAL;
        String passwordBD = this.controladoraBD.loguearUsuario(nombre);
        if(passwordBD != null){
            if(passwordBD.equals(this.encriptarPassword(password))){
                resultado = this.registrarUsuario(nombre);
            }
        }else{
            resultado = NO_EXISTE_USUARIO;
        }
        return resultado;
    }//fin de loguearUsuario

    public int registrarUsuario(String nombreUsuario){
        int resultado = PASSWORD_OK_LOGIN_ERROR;
        Usuario usuario = this.consultarUsuario(nombreUsuario);
        if(usuario != null){
            ControladoraPerfiles controladoraPerfil = new ControladoraPerfiles();
            PerfilYUsuarioBD perfilYUsuario = controladoraPerfil.consultarPerfil(usuario.getIdPerfil());
            if(perfilYUsuario != null && perfilYUsuario.getPerfil() != null){
                AdministradorSeguridad adminSeguridad = AdministradorSeguridad.getInstancia();
                adminSeguridad.registrarUsuario(usuario, perfilYUsuario.getPerfil());
                resultado = PASSWORD_OK_LOGIN_OK;
            }//fin de if
        }//fin de if
        return resultado;
    }//fin de registrarUsuario

    public String encriptarPassword(String password){
        StringBuffer passEncriptado = new StringBuffer();
        try{
            MessageDigest encriptador = MessageDigest.getInstance("SHA-512");
            encriptador.update(password.getBytes());
            byte [] bytesEncriptado = encriptador.digest();
            for(int i = 0; i < bytesEncriptado.length; i++){
                passEncriptado.append(bytesEncriptado[i]);
            }
        }catch(NoSuchAlgorithmException e){
            System.err.println("No existe el algoritmo de encriptación SHA-512 en su sistema");
            e.printStackTrace();
        }
        return passEncriptado.toString();
    }//fin de encriptarPassword

    public String consultarNombreRealUsuario(int idUsuario){
        return this.controladoraBD.consultarNombreRealUsuario(idUsuario);
    }//fin de consultarNombreRealUsuario

}//fin de clase ControladoraUsuarios
